package com.jinboe.cms.doc.util;


import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import com.jinboe.cms.doc.module.DocModule;

public class DocHelper {
	protected static String basePase="D:/workspace/JinBoeCms/";

	public static void main(String[] args) {
		DocModule docModule= initDoc(basePase+"resources/DateModule.xml");
		System.out.println(docModule.getAttributeValue("id"));
		for(DocModule module:docModule.getSubElementList() ){
			System.out.println(module.getAttributeValue("name"));
		}
		createDoc(docModule, basePase+"resources/DateModulex.xml");
	}
	/**
	 * 文档初始化  file 转化DocModule
	 * @param filePath
	 * @return
	 */
	public static DocModule initDoc(String filePath) {  
		DocModule docModule=new DocModule();
        File inputXml=new File(filePath);     
        SAXReader saxReader = new SAXReader();     
        Document document=null;
		try {
			document = saxReader.read(inputXml);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        Element rootElement=document.getRootElement();
        return initElement(rootElement);
    } 
	/**
	 * 创建DocModule文档
	 * @param docModule
	 * @param fileName
	 */
	public static void createDoc(DocModule docModule,String fileName) {   
        //创建document对象  
        Document document=DocumentHelper.createDocument();  
        //为document对象添加一级节点  
       
        Element rootElement= document.addElement(docModule.getName());
        createElement(rootElement, docModule);
        
        //在一级节点下添加二级节点  
        try {  
            /*直接通过write方法输出，如下，此时输出的xml文件中为默认的UTF-8编码，没有格式，空格也没有去除，实际上就是一个字符串；*/  
            Writer fileWriter=new FileWriter(fileName);  
            //XMLWriter xmlWriter=new XMLWriter(fileWriter);      
               
            /* 用XMLWriter类中的write方法，此时可以自行设置输出格式，比如紧凑型、缩减型：此时输出的xml文件中为gb2312编码，缩减型格式，但是多余的空格已经被清除：*/  
             OutputFormat format = OutputFormat.createPrettyPrint();//缩减型格式  
             //OutputFormat format = OutputFormat.createCompactFormat();//紧凑型格式  
             format.setEncoding("UTF-8");//设置编码  
             //format.setTrimText(false);//设置text中是否要删除其中多余的空格  
             XMLWriter xmlWriter=new XMLWriter(fileWriter,format);  
               
             /*如果想要对xml文件的输出格式进行设置，就必须用XMLWriter类，但是我们又需要保留其中的空格，此时我们就需要对format进行设置，也就是加上一句format.setTrimText(false); 
				这样就可以既保持xml文件的输出格式，也可以保留其中的空格;element中attribute中的值如果有空格的话在任何情况下是都不会去除空格的；*/  
             xmlWriter.write(document);  
             xmlWriter.close();   
        } catch (IOException e) {  
            e.printStackTrace();  
        }
    }  
	/**
	 * DocModule迭代创建Element
	 * @param docModule
	 */
	private static Element  createElement(Element docElement,DocModule docModule){
		
		if(StringUtils.isNotBlank(docModule.getText())){
			docElement.setText(docModule.getText());
		}
		if(docModule.getAttributeList()!=null){
			for(Map attributeMap:docModule.getAttributeList()){
				Set keySet=attributeMap.keySet();
				Iterator<String> it=keySet.iterator();
				while(it.hasNext()){
					String attributeName=it.next();
					docElement.setAttributeValue(attributeName,attributeMap.get(attributeName).toString());
				}
				
			}
		}
		
		List<DocModule> subElementList=docModule.getSubElementList();
		SysLogUtil.println("----subElementList:"+subElementList.size());
		if(subElementList!=null&&subElementList.size()!=0){
			for(DocModule subDocModule:subElementList){
				Element subElement=docElement.addElement(subDocModule.getName());
				createElement(subElement, subDocModule);
			}
		}
		return docElement;
	}
	
	
	/**
	 * 将Element转化为DocModule对象    element 转化DocModule
	 * @param element
	 * @return
	 */
	private static DocModule initElement(Element element){
		DocModule docModule=new DocModule();
		String name=element.getName();
		docModule.setName(name);
		String value=element.getText();
		docModule.setText(value);
		Iterator<Attribute>attributeIt=element.attributeIterator();
		if(attributeIt!=null){
			while(attributeIt.hasNext()){
				Attribute attribute=attributeIt.next();
				String attributeName=attribute.getName();
				String attributeVale=attribute.getValue();
				docModule.addAttribute(attributeName, attributeVale);
			}
		}
		Iterator elementIt=element.elementIterator();
        while(elementIt.hasNext()){
        	Element subElement=(Element)elementIt.next();
        	docModule.addSubElementList(initElement(subElement));
        }
        return docModule;
    }
}
